<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

require_once 'abstract_model.php';
require_once 'model_usuario.php';
require_once 'model_carga.php';

class model_cliente extends abstract_model{
    
    public $CLI_ID = null;
    public $CLI_NOME = "";
    public $CLI_FANTASIA = "";
    public $CLI_CNPJ_CPF = "";
    public $CLI_TIPO = "";
    public $CLI_IE_RG = "";
    public $CLI_EMAIL = "";
    public $CLI_MSN = "";
    public $CLI_SKYPE = "";
    public $CLI_DESCRICAO = "";
    public $CLI_DATA_CADASTRO = null;
    public $CLI_LOGRADOURO = "";
    public $CLI_COMPLEMENTO = "";
    public $CLI_CEP = "";
    public $CLI_BAIRRO = "";
    public $CLI_TEL1 = "";
    public $CLI_TEL2 = "";
    public $CLI_CELULAR = "";
    public $CLI_FAX = "";
    
    // Cidade
    public $CID_ID = null;
    public $CID_NOME = null;
    public $CID_LAT = null;
    public $CID_LNG = null;
    public $EST_ID = null;
    public $EST_SIGLA = null;
    public $EST_NOME = null;
    
    protected $prefix = "CLI";
    
    public function __construct() {
        $this->model_filhos = Array("usuario" => new model_usuario(), "carga" => new model_carga());
    }

    function formata_telefone($value){
        if (strlen($value) == 10)
            return "(${value[0]}${value[1]}) ${value[2]}${value[3]}${value[4]}${value[5]}-${value[6]}${value[7]}${value[8]}${value[9]}"; 
        else
            return $value;
    }
    
    public function setCLI_ID($value){
        if( !is_numeric($value))
            $this->throwValidationException ("O campo CLI_ID deve ser numerico");
        
        $this->CLI_ID = $value;
    }
    
    public function setCLI_NOME($value){
        // Nao pode ser nulo e tem que ter ate 60 caracteres
        $expressao = "/^.{1,60}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_NOME &eacute; obrigat&oacute;rio e deve ter no m&aacute;ximo 60 caracteres");
        
        $this->CLI_NOME = $value;
    }
    
    public function setCLI_FANTASIA($value){
        // Nao pode ser nulo e tem que ter ate 60 caracteres
        $expressao = "/^.{1,60}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_FANTASIA &eacute; obrigat&oacute;rio e deve ter no m&aacute;ximo 60 caracteres");
        
        $this->CLI_FANTASIA = $value;
    }
    
    public function setCLI_CNPJ_CPF($value){
        if (strlen($value)== 14){
            // Nao pode ser nulo e tem que ter o formato abaixo
            $expressao = "/^[0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}$/";
            if( !preg_match($expressao, $value))
                $this->throwValidationException("O campo CPF &eacute; inv&aacute;lido");
            //Testando o digito verificador
            if(!$this->validaCPF($value))
                $this->throwValidationException("Digito verificador do CPF invalido");
            
            $this->CLI_CNPJ_CPF = str_replace(array('-', '.'), '', $value);
        }else if (strlen($value)== 18){
            // Nao pode ser nulo e tem que ter o formato abaixo
            $expressao = "/^[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}-[0-9]{2}$/";
            if( !preg_match($expressao, $value))
                $this->throwValidationException("O campo CNPJ � inv�lido");
            //Testando o digito verificador
            if(!$this->validaCNPJ($value))
                $this->throwValidationException("Digito verificador do CNPJ invalido");
            
            $this->CLI_CNPJ_CPF = str_replace(array('-', '.', '/'), '', $value);
        }else{
            $this->throwValidationException("Comprimento invalido do CNPJ/CPF");
            $this->CLI_CNPJ_CPF = $value;
        }
    }
    
    public function setCLI_TIPO($value){
        // Nao pode ser nulo e tem que ser F ou J
        if ($value == 'F' || $value == 'J'){
            $this->CLI_TIPO = $value;
        }else 
            $this->throwValidationException("Valor incorreto para o campo CLI_TIPO");
    
    }
    
    
    public function setCLI_IE_RG($value){
        // Nao pode ser nulo e tem que ter entre 3 a 20 caracteres
        $expressao = "/^.{0,20}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_IE_RG deve ter no m&aacute;ximo 20 caracteres");
        
        $this->CLI_IE_RG = $value;
        
    }
    
    public function setCLI_EMAIL($value){
        // Nao pode ser nulo e tem que ter entre 7 a 40 caracteres
        $expressao = "/^.{1,40}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_EMAIL &eacute; obrigat&oacute;rio e deve ter no m&aacute;ximo 40 caracteres");
        // Tem que ser um email valido
        $expressao = "/^\w+[\.\-\w]+@\w+([\.][\w]+)+$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_EMAIL esta no formato inv&aacute;lido, certifique-se de ter digitado um e-mail valido");
        
        $this->CLI_EMAIL = $value;
    }
    
    public function setCLI_MSN($value){
        // Pode ser nulo ou ter entre 3 a 20 caracteres
        $expressao = "/^.{0,40}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_MSN pode ter no m&aacute;ximo 40 caracteres");
        // Tem que ser um e-mail valido
        $expressao = "/^$|(^\w+[\.]?\w+@\w+([\.][\w]+)+$)/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_MSN esta no formato invalido, certifique-se de ter digitado um e-mail valido");
        
        $this->CLI_MSN = $value;
    }
    
    public function setCLI_SKYPE($value){
        // Pode ser nulo ou ter entre 3 a 20 caracteres
        $expressao = "/^.{0,20}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_SKYPE deve ter no m&aacute;ximo 20 caracteres");
                
        $this->CLI_SKYPE = $value;
        
    }
    
    public function setCLI_DATA_CADASTRO($value){
        // A data deve ter o formato abaixo
        $expressao = "/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_DATA_CADASTRO deve ter no m&aacute;ximo 20 caracteres");


        // Como validar a data
        $data = explode('/', $value);
        $d = $data[0];
        $m = $data[1];
        $a = $data[2];
        if (!checkdate($m, $d, $a)){
            $this->throwValidationException("O campo CLI_DATA_CADASTRO possui valor invalido");
            return $this->CLI_DATA_CADASTRO;
        }
        $this->CLI_DATA_CADASTRO = "$a-$m-$d";
    }
    
    public function setCLI_LOGRADOURO($value){
        // Nao pode ser nulo e tem que ter entre 3 a 60 caracteres
        $expressao = "/^.{1,60}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_LOGRADOURO � obrigat&oacute;rio e deve ter no m&aacute;ximo 60 caracteres");
                
        $this->CLI_LOGRADOURO = $value;
    }
    
    public function setCLI_COMPLEMENTO($value){
        // Pode ser nulo ou ter entre 3 a 30 caracteres
        $expressao = "/^.{0,30}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_COMPLEMENTO deve ter no m&aacute;ximo 30 caracteres");
                
        $this->CLI_COMPLEMENTO = $value;
    }
    
    public function setCLI_CEP($value){
        // Tem que estar no formato abaixo
        $expressao = "/^[0-9]{5}\-[0-9]{3}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_CEP esta em um formato invalido");
                
        $this->CLI_CEP = str_replace(array('-'), '', $value);
    }
    
    public function setCLI_BAIRRO($value){
        // Pode ser nulo ou ter entre 3 a 30 caracteres
        $expressao = "/^.{0,30}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_BAIRRO deve ter no m&aacute;ximo 30 caracteres");
                
        $this->CLI_BAIRRO = $value;
        
    }
    
    public function setCLI_TEL1($value){
        // Nao pode ser nulo e tem que ter o formato abaixo
        $expressao = "/^\([0-9]{2}\) [0-9]{4}-[0-9]{4}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_TEL1 esta em branco ou possui formato invalido");
                
        $this->CLI_TEL1 = str_replace(array('(', ')', ' ','-'), '', $value);
    }
    
    public function setCLI_TEL2($value){
        // Pode ser nulo ou ter o formato abaixo
        $expressao = "/^$|^\([0-9]{2}\)\ [0-9]{4}-[0-9]{4}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_TEL2 esta em um formato invalido");
                
        $this->CLI_TEL2 = str_replace(array('(', ')', ' ','-'), '', $value);
    }
    
    public function setCLI_CELULAR($value){
        // Pode ser nulo ou ter o formato abaixo
        $expressao = "/^$|^\([0-9]{2}\)\ [0-9]{4}-[0-9]{4}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_CELULAR esta em um formato invalido");
                
        $this->CLI_CELULAR = str_replace(array('(', ')', ' ','-'), '', $value);
    }
    
    public function setCLI_FAX($value){
        // Pode ser nulo ou ter o formato abaixo
        $expressao = "/^$|^\([0-9]{2}\)\ [0-9]{4}-[0-9]{4}$/";
        if( !preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_FAX esta em um formato invalido");
                
        $this->CLI_FAX = str_replace(array('(', ')', ' ','-'), '', $value);
    }
    
    public function setCLI_DESCRICAO($value){
        // Pode ser nulo ou ter ate 255 caracteres
        // Remove o retorno de linha da string
        $value = str_replace("\r", "", $value);
        echo strlen($value);
        $expressao = "/^.{0,255}$/s";
        if(!preg_match($expressao, $value))
            $this->throwValidationException("O campo CLI_DESCRICAO pode ter ate 255 caracteres");
        
        $this->CLI_DESCRICAO = $value;
        
    }
    
    public function getCLI_ID(){
        return $this->CLI_ID;
    }
    
    public function getCLI_NOME(){
        return $this->convert_characters($this->CLI_NOME);
    }
    
    public function getCLI_FANTASIA(){
        return $this->convert_characters($this->CLI_FANTASIA);
    }
    
    public function getCLI_TIPO(){
        return $this->CLI_TIPO;
    }
    
    public function getCLI_CNPJ_CPF(){
        $value = $this->CLI_CNPJ_CPF;
        if(strlen($value) == 11)
                return "${value[0]}${value[1]}${value[2]}.${value[3]}${value[4]}${value[5]}.${value[6]}${value[7]}${value[8]}-${value[9]}${value[10]}"; 
        else if (strlen($value) == 14)
            return "${value[0]}${value[1]}.${value[2]}${value[3]}${value[4]}.${value[5]}${value[6]}${value[7]}/${value[8]}${value[9]}${value[10]}${value[11]}-${value[12]}${value[13]}"; 
        else
            return $value;    
    }
    
    public function getCLI_IE_RG(){
        return $this->convert_characters($this->CLI_IE_RG);
    }
    
    public function getCLI_EMAIL(){
        return $this->convert_characters($this->CLI_EMAIL);
    }
    
    public function getCLI_MSN(){
        return $this->convert_characters($this->CLI_MSN);
    }
    
    public function getCLI_SKYPE(){
        return $this->convert_characters($this->CLI_SKYPE);
    }
    
    public function getCLI_DATA_CADASTRO(){
        // Como validar a data
        if ($this->CLI_DATA_CADASTRO != NULL){
            $data = explode('-', $this->CLI_DATA_CADASTRO);
            $a = $data[0];
            $m = $data[1];
            $d = $data[2];
            return "$d/$m/$a";
        }
        return NULL;
    }
    
    public function getCLI_LOGRADOURO(){
        return $this->convert_characters($this->CLI_LOGRADOURO);
    }
    
    public function getCLI_COMPLEMENTO(){
        return $this->convert_characters($this->CLI_COMPLEMENTO);
    }
    
    public function getCLI_BAIRRO(){
        return $this->convert_characters($this->CLI_BAIRRO);
    }
    
    public function getCLI_CEP(){
        $value = $this->CLI_CEP;
        if (strlen($value) == 8)
            return "${value[0]}${value[1]}${value[2]}${value[3]}${value[4]}-${value[5]}${value[6]}${value[7]}"; 
        else
            return $value;
    }
    
    public function getCLI_TEL1(){
        return $this->formata_telefone($this->CLI_TEL1);
    }
    
    public function getCLI_TEL2(){
        return $this->formata_telefone($this->CLI_TEL2);
    }
    
    public function getCLI_CELULAR(){
        return $this->formata_telefone($this->CLI_CELULAR);
    }
    
    public function getCLI_FAX(){
        return $this->formata_telefone($this->CLI_FAX);
    }
    
    public function getCLI_DESCRICAO(){
        return $this->convert_characters($this->CLI_DESCRICAO);
    }
    
    
    // Manipula os dados da tabela cidade
    public function setCID_ID($value){
        if (!is_numeric($value)) $this->throwValidationException("Dado incorreto para CID_ID");
        
        $this->CID_ID = $value;
    }
    
    public function setCID_NOME($value){
        $this->CID_NOME = $value;
    }
    
    public function setEST_ID($value){
        $this->EST_ID = $value;
    }
    
    public function setEST_SIGLA($value){
        $this->EST_SIGLA = $value;
    }
    
    public function setEST_NOME($value){
        $this->EST_NOME = $value;
    }
    
    public function getCID_ID(){
        return $this->CID_ID;
    }
    
    public function getCID_NOME(){
        return $this->CID_NOME;
    }
    
    public function getEST_ID(){
        return $this->EST_ID;
    }
    
    public function getEST_NOME(){
        return $this->EST_NOME;
    }
    
    public function getEST_SIGLA(){
        return $this->EST_SIGLA;
    }
    
    
    // Fun��o que valida o CPF
    function validaCPF($cpf)
    {	// Verifiva se o n�mero digitado cont�m todos os digitos
        $cpf = str_pad(preg_replace('/[^0-9]/', '', $cpf), 11, '0', STR_PAD_LEFT);

            // Verifica se nenhuma das sequ�ncias abaixo foi digitada, caso seja, retorna falso
        if (strlen($cpf) != 11 || $cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || $cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || $cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || $cpf == '99999999999')
            {
            return false;
        }
            else
            {   // Calcula os n�meros para verificar se o CPF � verdadeiro
            for ($t = 9; $t < 11; $t++) {
                for ($d = 0, $c = 0; $c < $t; $c++) {
                    $d += $cpf{$c} * (($t + 1) - $c);
                }

                $d = ((10 * $d) % 11) % 10;

                if ($cpf{$c} != $d) {
                    return false;
                }
            }

            return true;
        }
    }
    
    /**
     * validaCNPJ
     *
     * Esta fun��o testa se um Cnpj � valido ou n�o. 
     *
     * @author	Raoni Botelho Sporteman <raonibs@gmail.com>
     * @version	1.0 Debugada em 27/09/2011 no PHP 5.3.8
     * @param	string		$cnpj			Guarda o Cnpj como ele foi digitado pelo cliente
     * @param	array		$num			Guarda apenas os n�meros do Cnpj
     * @param	boolean		$isCnpjValid	Guarda o retorno da fun��o
     * @param	int			$multiplica 	Auxilia no Calculo dos D�gitos verificadores
     * @param	int			$soma			Auxilia no Calculo dos D�gitos verificadores
     * @param	int			$resto			Auxilia no Calculo dos D�gitos verificadores
     * @param	int			$dg				D�gito verificador
     * @return	boolean						"true" se o Cnpj � v�lido ou "false" caso o contr�rio
     *
     */

     function validaCNPJ($cnpj)
    {
            //Etapa 1: Cria um array com apenas os digitos num�ricos, isso permite receber o cnpj em diferentes formatos como "00.000.000/0000-00", "00000000000000", "00 000 000 0000 00" etc...
            $j=0;
            for($i=0; $i<(strlen($cnpj)); $i++)
                    {
                            if(is_numeric($cnpj[$i]))
                                    {
                                            $num[$j]=$cnpj[$i];
                                            $j++;
                                    }
                    }
            //Etapa 2: Conta os d�gitos, um Cnpj v�lido possui 14 d�gitos num�ricos.
            if(count($num)!=14)
                    {
                            $isCnpjValid=false;
                    }
            //Etapa 3: O n�mero 00000000000 embora n�o seja um cnpj real resultaria um cnpj v�lido ap�s o calculo dos d�gitos verificares e por isso precisa ser filtradas nesta etapa.
            if ($num[0]==0 && $num[1]==0 && $num[2]==0 && $num[3]==0 && $num[4]==0 && $num[5]==0 && $num[6]==0 && $num[7]==0 && $num[8]==0 && $num[9]==0 && $num[10]==0 && $num[11]==0)
                    {
                            $isCnpjValid=false;
                    }
            //Etapa 4: Calcula e compara o primeiro d�gito verificador.
            else
                    {
                            $j=5;
                            for($i=0; $i<4; $i++)
                                    {
                                            $multiplica[$i]=$num[$i]*$j;
                                            $j--;
                                    }
                            $soma = array_sum($multiplica);
                            $j=9;
                            for($i=4; $i<12; $i++)
                                    {
                                            $multiplica[$i]=$num[$i]*$j;
                                            $j--;
                                    }
                            $soma = array_sum($multiplica);	
                            $resto = $soma%11;			
                            if($resto<2)
                                    {
                                            $dg=0;
                                    }
                            else
                                    {
                                            $dg=11-$resto;
                                    }
                            if($dg!=$num[12])
                                    {
                                            $isCnpjValid=false;
                                    } 
                    }
            //Etapa 5: Calcula e compara o segundo d�gito verificador.
            if(!isset($isCnpjValid))
                    {
                            $j=6;
                            for($i=0; $i<5; $i++)
                                    {
                                            $multiplica[$i]=$num[$i]*$j;
                                            $j--;
                                    }
                            $soma = array_sum($multiplica);
                            $j=9;
                            for($i=5; $i<13; $i++)
                                    {
                                            $multiplica[$i]=$num[$i]*$j;
                                            $j--;
                                    }
                            $soma = array_sum($multiplica);	
                            $resto = $soma%11;			
                            if($resto<2)
                                    {
                                            $dg=0;
                                    }
                            else
                                    {
                                            $dg=11-$resto;
                                    }
                            if($dg!=$num[13])
                                    {
                                            $isCnpjValid=false;
                                    }
                            else
                                    {
                                            $isCnpjValid=true;
                                    }
                    }
            //Trecho usado para depurar erros.
            /*
            if($isCnpjValid==true)
                    {
                            echo "<p><font color=\"GREEN\">Cnpj � V�lido</font></p>";
                    }
            if($isCnpjValid==false)
                    {
                            echo "<p><font color=\"RED\">Cnpj Inv�lido</font></p>";
                    }
            */
            //Etapa 6: Retorna o Resultado em um valor booleano.
            return $isCnpjValid;			
    }

}
?>
